package com.mo.lib.ui.fragment

import android.app.Activity
import android.content.Context
import android.os.Bundle
import android.view.View
import androidx.annotation.LayoutRes
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import com.mo.lib.ui.action.HandlerAction
import com.mo.lib.utils.closeSoftKeyboard

/**
 * @ author：mo
 * @ data：2021/9/23:17:24
 * @ 功能：
 */
abstract class BaseFragment() : Fragment(), HandlerAction {
    /** 载体activity*/
    protected lateinit var mActivity: Activity

    /**根view是否创建 */
    private var isViewCreated = false

    /**是否对用户可见（vp时触发，其他情况不触发） */
    private var isVisibleToUser = false

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        isViewCreated = true

    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        initView(arguments)
    }

    override fun onResume() {
        super.onResume()
        if (isVisibleToUser) {
            loadDataVp()
        }
        if (!isHidden) {
            loadDataOnShow()
        }
    }

    /** 此方法在onCreateView前执行 (这个方法只会在 ViewPager 和 FragmentPagerAdapter一起使用时才会触发。我们可以通过 getUserVisibleHint 来得到这个状态。)*/
    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        this.isVisibleToUser = isVisibleToUser
        if (isViewCreated && isVisibleToUser) {
            loadDataVp()
        }
    }

    /** 使用show/hide方法时，会触发此方法*/
    override fun onHiddenChanged(hidden: Boolean) {
        super.onHiddenChanged(hidden)
        if (!hidden) {
            loadDataOnShow()
        }
    }

    /**当fragment调用show/hide切换碎片或者跳出返回时更新数据 */
    protected open fun loadDataOnShow() {}

    /** 当配合vp使用时，vp切换或者跳出返回时及时更新数据*/
    protected open fun loadDataVp() {}
    protected abstract fun initView(arguments: Bundle?)
    override fun onDestroy() {
        super.onDestroy()
        mActivity!!.closeSoftKeyboard()
    }

    /**关联activity，不可见 */
    override fun onAttach(context: Context) {
        super.onAttach(context) //获得全局的，防止使用getActivity()为空
        mActivity = context as Activity
    }
}

fun <T : View> Fragment.findViewById(id: Int): T? {
    this.view?.let {
        return it.findViewById<T>(id)
    }
    return null
}